001 /* 002 * Copyright 2006 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.lang; 020 021 import java.io.Writer; 022 import java.io.IOException; 023 024 /** 025 * Utility used to write value instances to an output stream as XML. 026 * 027 * @author <a href="http://www.dpml.net">The Digital Product Meta Library</a> 028 * @version 1.0.0 029 */ 030 public final class ValueEncoder 031 { 032 /** 033 * Write an array of values to XML. 034 * @param writer the output stream writer 035 * @param values the value array 036 * @param pad the character offset 037 * @exception IOException if an IO error occurs 038 */ 039 public void encodeValues( Writer writer, Value[] values, String pad ) throws IOException 040 { 041 for( int i=0; i<values.length; i++ ) 042 { 043 Value value = values[i]; 044 encodeValue( writer, value, pad ); 045 } 046 } 047 048 049 /** 050 * Write a value to XML. 051 * @param writer the output stream writer 052 * @param value the value 053 * @param pad the character offset 054 * @exception IOException if an IO error occurs 055 */ 056 public void encodeValue( Writer writer, Value value, String pad ) throws IOException 057 { 058 if( value instanceof Construct ) 059 { 060 Construct construct = (Construct) value; 061 String method = construct.getMethodName(); 062 String target = construct.getTargetExpression(); 063 064 writer.write( "\n" + pad + "<param" ); 065 if( null != target ) 066 { 067 writer.write( " class=\"" + target + "\"" ); 068 } 069 if( null != method ) 070 { 071 writer.write( " method=\"" + method + "\"" ); 072 } 073 if( construct.isCompound() ) 074 { 075 writer.write( ">" ); 076 Value[] values = construct.getValues(); 077 encodeValues( writer, values, pad + " " ); 078 writer.write( "\n" + pad + "</param>" ); 079 } 080 else 081 { 082 String v = construct.getBaseValue(); 083 if( null != v ) 084 { 085 writer.write( " value=\"" + v + "\"" ); 086 } 087 writer.write( "/>" ); 088 } 089 } 090 else 091 { 092 final String error = 093 "Value class [" 094 + value.getClass().getName() 095 + "] not supported."; 096 throw new IOException( error ); 097 } 098 } 099 }